// dataManager.js - 统一管理所有图表数据
class WeatherDataManager {
    constructor() {
        this.currentDistrict = null;
        this.currentDate = new Date().toISOString().split('T')[0];
        this.observers = []; // 观察者模式，用于通知图表更新
        console.log('WeatherDataManager 初始化完成');
    }

    // 设置当前选中的区域
    async setCurrentDistrict(district, date = null) {
        this.currentDistrict = district;
        if (date) {
            this.currentDate = date;
        }
        await this.notifyObservers();
    }

    // 注册观察者（图表）
    addObserver(observer) {
        this.observers.push(observer);
        console.log('注册观察者，当前观察者数量:', this.observers.length);
    }

    // 通知所有观察者更新（支持异步）
    async notifyObservers() {
        console.log('通知观察者更新，区域:', this.currentDistrict, '日期:', this.currentDate, '观察者数量:', this.observers.length);

        try {
            // 获取数据
            const chartData = await this.generateChartData(this.currentDistrict, this.currentDate);
            console.log('获取到的图表数据:', chartData);

            // 通知所有观察者，传递数据
            this.observers.forEach((observer, index) => {
                if (typeof observer.update === 'function') {
                    console.log(`通知观察者 ${index}`);
                    observer.update(this.currentDistrict, this.currentDate, chartData);
                }
            });
        } catch (error) {
            console.error('通知观察者时出错:', error);
        }
    }

    // 生成图表数据（从后端获取或使用模拟数据）
    generateChartData(district, date) {
        console.log('为区域生成图表数据:', district, date);

        // 尝试从后端获取真实数据，失败时使用模拟数据
        return this.fetchRealWeatherData(district, date)
            .then(realData => {
                console.log('使用真实数据:', realData);
                return realData;
            })
            .catch(error => {
                console.warn('获取真实数据失败，使用模拟数据:', error);
                return this.generateMockData(district, date);
            });
    }

    // 从后端获取真实数据
    async fetchRealWeatherData(district, date) {
        try {
            const response = await fetch(`/hourly/data?district=${encodeURIComponent(district)}&date=${date}`);
            if (response.ok) {
                const data = await response.json();
                console.log('后端返回的数据:', data);
                return data;
            } else {
                throw new Error(`HTTP ${response.status}: ${response.statusText}`);
            }
        } catch (error) {
            console.error('获取真实数据失败:', error);
            throw error;
        }
    }

    // 模拟数据生成方法
    generateMockData(district, date) {
        console.log('生成模拟数据:', district);

        // 使用简单的基于区域名称的随机种子
        let seed = 0;
        for (let i = 0; i < district.length; i++) {
            seed += district.charCodeAt(i);
        }

        const random = () => {
            seed = (seed * 9301 + 49297) % 233280;
            return seed / 233280;
        };

        return {
            // 风速：1-15 m/s
            windSpeed: Array.from({length: 24}, (_, i) =>
                (1 + random() * 8 + Math.sin(i * Math.PI / 12) * 3).toFixed(1)
            ),
            // 风向
            windDirection: Array.from({length: 24}, () =>
                ['北', '东北', '东', '东南', '南', '西南', '西', '西北'][Math.floor(random() * 8)]
            ),
            // 气压：1005-1015 hPa
            pressure: Array.from({length: 24}, (_, i) =>
                (1005 + random() * 10 + Math.cos(i * Math.PI / 6) * 2).toFixed(1)
            ),
            // 温度：15-32°C（5-9月合理范围）
            temperature: Array.from({length: 24}, (_, i) =>
                (15 + random() * 12 + Math.sin(i * Math.PI / 12) * 5).toFixed(1)
            ),
            // 降水量：0-8 mm
            precipitation: Array.from({length: 24}, () =>
                (random() * 8).toFixed(2)
            ),
            // 能见度：2-15 km
            visibility: Array.from({length: 24}, (_, i) =>
                (2 + random() * 8 + Math.sin(i * Math.PI / 8) * 3).toFixed(1)
            ),
            // 云量：20-90%
            cloudCover: Array.from({length: 24}, (_, i) =>
                Math.floor(20 + random() * 70 + Math.sin(i * Math.PI / 6) * 10)
            )
        };
    }
}

// 创建全局数据管理器实例
window.weatherDataManager = new WeatherDataManager();